﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using WcfServices.ServiceInterfaces;
using WcfServices.Utilities;
using BLL;
using Newtonsoft.Json;
using EntitiesLayer;
using Newtonsoft.Json.Linq;
using System.Drawing;
using Newtonsoft.Json.Converters;

namespace WcfServices
{
    
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class UsuarioService : IUsuarioService
    {

        private GestorMantenimientoUsuarios gestor;
  

        public UsuarioService() {

            gestor = new GestorMantenimientoUsuarios();
            
        }
        

        public void Create(Stream json)
        {
            JObject dic =
                json.DeserializeJson<JObject>();


            // falta NumeroTelefono, CorreoElectronico
                gestor.registrarUsuario(
                dic.Value<string>("Identificacion"),
                    dic.Value<string>("Nombre"),
                    dic.Value<string>("PApellido"), dic.Value<string>("SApellido"),
                    dic.Value<string>("FechaNacimiento").ToGlobalDateAplicationFormat(),
                    dic.Value<string>("FechaIngreso").ToGlobalDateAplicationFormat(),
                    (Genero)(dic.Value<char>("GeneroCode")),
                    dic.Value<string>("FotoBase64").ToImageByte().toBitMap(),
                    dic.Value<string>("Alias"),
                    dic.Value<string>("NombreUsuario"),
                    dic.Value<string>("DiscripcionTipoId"),
                    dic.Value<string>("Nacionalidad"),
                    dic.Value<int>("IdRol"),
                    dic.Value<string>("Telefono"), 
                    dic.Value<string>("Correo"),
                    dic.Value<char>("TipoCode"));

                Util.interceptWithNoReturn(gestor.guadarCambiosUsuario); 
        }

        public void Delete(int id)
        {

            gestor.EliminarUsuario(id);
            gestor.guadarCambiosUsuario();
        }

        public string Listar()
        {
            return ListarUsuarioTemplate(gestor.ListarUsuarios);
             
        }

        public string ListarClientesConPlan() { 
        
            return ListarUsuarioTemplate(gestor.listarClientesConPlan);
        }
        public string ListarFuncionarios()
        {
            return ListarUsuarioTemplate(gestor.ListarFuncionarios);
             
        }

        private string ListarUsuarioTemplate(Func<IEnumerable<Usuario>> u){
            IEnumerable<Usuario> usuarios = Util.interceptWithReturn(u);

            Type[] ingnoreTypes =  { 
                                      typeof(IList<>), 
                                      typeof(Bitmap), 
                                      typeof(bool) , 
                                      typeof(DateTime), 
                                      typeof(Rol)
                                  };

            string[] ignoreProperties = { 
                                            "Alias", 
                                            "DiscripcionTipoId",
                                            "Nacionalidad", 
                                            "FotoBase64",
                                            "Tipo", 
                                            "Estado",
                                            "Genero",
                                            "listaPagos",
                                            "PruebaResistencia"
                                        };

            if (usuarios != null)
            {
                return usuarios.JsonSerialize(

                    ignoreTypes: ingnoreTypes,
                    ignorePropertie: ignoreProperties

                    );
            }

            return "";
        }

        public string ListarClientes()
        {
            return ListarUsuarioTemplate(gestor.ListarCliente);

        }

        public string BuscarPorId(int id)
        {
            Usuario usuario = Util.interceptWithReturn(()=>gestor.consultarPorId(id));

            Type[] ingnoreTypes=  { 
                                      typeof(IList<>), 
                                      typeof(Bitmap), 
                                      typeof(bool),
                                      typeof(Genero),
                                      typeof(EstadoUsuario)
                                  };


            if (usuario != null)
            {
                
                IList<Telefono> telefonos= usuario.ListaTelefono;
                IList<CorreoElectronico> correos= usuario.ListaCorreo;

                JObject jusuario = JObject.Parse(usuario.JsonSerialize(ignoreTypes: ingnoreTypes));

                Func<object, JToken> fromO = JToken.FromObject;

                jusuario.Add("Telefono", (telefonos != null) ? fromO(telefonos.Last().NumeroTelefono) : fromO(""));               
                jusuario.Add("Correo", (correos != null)? fromO(correos.Last().Correo): fromO(""));
                

                return jusuario.ToString(Formatting.None);
            
            }

            return "";
        }

        public void Update(Stream json)
        {

            /*
*/
            
            JObject dic = 
                json.DeserializeJson<JObject>();

           


                    gestor.ModificarUsuarioUltimoCT(
                    dic.Value<string>("Identificacion"), 
                    dic.Value<string>("Nombre"),
                    dic.Value<string>("PApellido"), dic.Value<string>("SApellido"),
                    dic.Value<string>("FechaNacimiento").ToGlobalDateAplicationFormat(),
                    dic.Value<string>("FechaIngreso").ToGlobalDateAplicationFormat(),
                    (Genero)(dic.Value<char>("GeneroCode")),
                    dic.Value<string>("FotoBase64").ToImageByte().toBitMap(),
                    dic.Value<string>("Alias"), 
                    dic.Value<string>("NombreUsuario"),
                    dic.Value<string>("DiscripcionTipoId"),
                    dic.Value<string>("Nacionalidad"),
                    dic.Value<int>("Rol"),//no seguro
                    dic.Value<int>("Id"), //no seguro
                    dic.Value<int>("ResetPass") == 1,
                    (EstadoUsuario)dic.Value<char>("EstadoCode"),
                    dic.Value<string>("Correo"), 
                    dic.Value<string>("Telefono"),
                    (TipoUsuario)(dic.Value<char>("TipoCode")));

                    Util.interceptWithNoReturn(gestor.guadarCambiosUsuario);
                
        }

        public string ConstanteNacionalidades()
        {
            return JsonConvert.SerializeObject(Constantes.Nacionalidades);
        }

        public string ConstanteTipoId()
        {
            return JsonConvert.SerializeObject(Constantes.TiposId);
        }

        public string ConstanteTipoTelefono()
        {
            return JsonConvert.SerializeObject(Constantes.TiposTelefonos);
        }

        public string ConstanteTipoCorreo()
        {
            return JsonConvert.SerializeObject(Constantes.TiposCorreos);
        }


    }
}
